<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //1.let 无法做变量提升
        // console.log(a);//报错
        // let a=2;

        //2. 阻断了与window的关系
        // let a=2;
        // console.log(window.a);//undefined

        //3.不能重复声明 let/let  var/let
        // var a=10;
        // let a=100;

        // let a=2;
        // console.log(a);
        // var a=3; 
        // console.log(3);


        // let a=10,
        // b=10;
        // let fn=function(){
        //     console.log(a);//报错 当前私有函数执行上下文中，存在变量a,用let声明的，无法提前使用
        //     let a=b=20;
        //     console.log(a,b);
        // };
        // fn();
        // console.log(a,b)

        //EC(G) a-10  b-10-20
        // let a=10,
        // b=10;
        // let fn=function(){
        //     //EC(fn) a-20
        //     let a=b=20;
        //     console.log(a,b);// 20 20
        // };
        // fn();
        // console.log(a,b);// 10 20

    //    let 存在暂时性死区，必须声明后才能使用，否则报错

      // console.log(a);//报错

      //typeof 不存在的变量，默认返回 undefined
       //console.log(typeof a);//undefined

    //    console.log(typeof a);
    //    let a=2;

   //EC(G) a-12 b-13 c-14-20
   // a b c fn-0x002
    // var a=12,b=13,c=14;
    // function fn(a){
    //     //EC(fn) a-12-20  b-und-20
    //     //b
    //     //a
    //     console.log(a,b,c);// 12 und 14 
    //     var b=c=a=20;
    //     console.log(a,b,c);// 20 20 20
    // }
    // fn(a);
    // console.log(a,b,c);// 12 13 20


    // var ary=[12,13];
    // function fn(ary){
    //     console.log(ary);
    //     ary[0]=100;
    //     ary=[100];
    //     ary[0]=0;
    //     console.log(ary);
    // }
    // fn(ary);
    // console.log(ary);

    //EC(G)  a-2  fn--0x002  sum-0x003
    // a  fn--0x002  sum-0x003
    // var a=2;
    // function fn(){
    //     //EC(fn) 
    //     // <EC(fn),EC(G)>
    //    console.log(a);//2  2
    // }
    // fn();
    // function sum(){
    //     //EC(sum)  a--3
    //     // <EC(sum)，EC(G)>
    //     var a=3;
    //     fn();
    // }
    // sum();


    // function show(){
    //    console.log(arguments);//形参集合
    //    console.log(arguments.callee);//函数本身
    //    console.log(arguments.callee.caller);//函数在哪个作用域执行的
    //    //全局执行  null
    // }


    // function A(){
    //     show(10,20,30)
    // }
    // A()
  
    </script>

    堆：只要用来存储引用数据类型的值（对象存的是键值对，函数存的是字符串）
    栈：原始类型的值，代码进栈执行

    栈内存释放：
    1.全局的栈内存，关闭页面才会释放
    2.函数执行完后，一般都会释放
    3.函数执行完后，如果不释放，就会形成闭包
    当前作用域中如果有一个引用数据类型的值被外面的变量占用就不销毁

    堆内存释放：
    1.设置值为null
</body>
</html>